/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
// import {
//   applyDecorators,
//   Param,
//   ExecutionContext,
//   createParamDecorator,
// } from '@nestjs/common';
// import { ApiParam } from '@nestjs/swagger';
// /**
//  * 解决方案是使用applyDecorators将多个装饰器组合在一起。
//  * 例如，将@Param('id')和@ApiParam({ name: 'id' })与自定义逻辑结合到同一个装饰器中。
//  * 这样，当在控制器方法中使用该装饰器时，
//  * 既可以从请求中获取参数值，又可以让Swagger生成相应的文档。

// 下面 params，apiparams 直接组合会造成 @userParams("id") 报错，和下面的 params 报错
// applyDecorators 用于组合方法/类/属性装饰器，
// 而 @Param() 是参数装饰器，不能直接与 @ApiParam()（方法装饰器）组合。
// TypeScript 无法混合两者的签名，导致类型错误。

//  * @param id
//  * @returns
//  */
// export const UserParam = (id: string) => {
//   return applyDecorators(
//     Param(id), // 实际从路由参数中取值
//     ApiParam({ name: id, description: `路由参数 ${id}` }), // Swagger 文档
//   );
// };

// user.decorator.ts
import { Param, ExecutionContext, createParamDecorator } from '@nestjs/common';
import { ApiParam } from '@nestjs/swagger';
import { Reflector } from '@nestjs/core';

export const UserParam = (paramName: string) => {
  // 1. 参数装饰器：获取路由参数
  const paramDecorator = Param(paramName);

  // 2. 方法装饰器：动态添加 ApiParam
  const apiParamDecorator = (target: any, propertyKey: string) => {
    ApiParam({ name: paramName, description: `参数 ${paramName}` })(
      target,
      propertyKey,
      Object.getOwnPropertyDescriptor(target, propertyKey),
    );
  };

  // 3. 返回组合逻辑：先应用参数装饰器，再应用方法装饰器
  return (target: any, propertyKey: string, parameterIndex: number) => {
    paramDecorator(target, propertyKey, parameterIndex); // 应用参数装饰器
    apiParamDecorator(target.constructor, propertyKey); // 应用方法装饰器到类方法
  };
};
